package dao;

import connection.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import model.Esporte;
import model.Usuario;

/**
 *
 * @author juliana_carlos
 * Classe Usuario_imp implementa a classe Usuario_int.
 */
public class Usuario_imp implements Usuario_int {
    /**
     * Strings do Mysql utilizadas para criar, listar, atualizar, deletar e buscar.
     */
   
    /**
     * Comando utilizado para inserir dados na tabela usuario.
     */ 
    private final String create = "INSERT INTO tb_usuario(nome,email,senha,tipousuario) VALUES (?,?,?,?)";
    /**
     * Comando utilizado para listar todos os dados da tabela usuario.
     */
    private final String read   = "SELECT*FROM tb_usuario";
    /**
     * Comando utilizado para atualizar todos os dados da tabela usuario.
     */
    private final String update = "UPDATE tb_usuario SET nome=?,email=?,senha=?,tipousuario=? WHERE idusuario=?";
    /**
     * Comando utilizado para deletar os dados da tabela usuario através do idusuario.
     */
    private final String delete = "DELETE FROM tb_usuario WHERE idusuario=?";
    /**
     * Comando utilizado para buscar os dados da tabela usuario através do nome.
     */
    private final String search = "SELECT*FROM tb_usuario WHERE nome=?";
    /**
     * Variáveis utilizadas na classe.
     */
    private Connection con;
    private PreparedStatement stmt;
    private ArrayList<Usuario> espArray;
    private Usuario espModelo;
/**
 * Método utilizado para instânciar uma nova conexão.
 */
    public Usuario_imp() {
        try {
            con = new ConnectionFactory().getConnection();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
/**
 * Método utilizado para criar os dados do usuario do sistema. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Usuario.
 * 
 */
    @Override
    
    public void create(Usuario e) {
        try {
            stmt = con.prepareStatement(create);
            stmt.setString(1, e.getNome());
            stmt.setString(2, e.getEmail());
            stmt.setString(3, e.getSenha());
            stmt.setInt(2, e.getTipousuario());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga inserir o usuario do sistema.
             */
            JOptionPane.showMessageDialog(null, "Erro ao inserir usuario");
        }
    }
/**
 * Método utilizado para listar os dados do usuario do sistema .
 * @return o Array, utilizado para finalizar o método. 
 */
    @Override
 
    public ArrayList<Usuario> read() {
 /**
  * espArray está instânciando um Array.
  */
        espArray = new ArrayList<>();
        try {
            stmt = con.prepareStatement(read);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                espModelo = new Usuario();
                espModelo.setIdusuario(rs.getInt("idusuario"));
                espModelo.setNome(rs.getString("nome"));
                espModelo.setEmail(rs.getString("email"));
                espModelo.setSenha(rs.getString("senha"));
                espModelo.setTipousuario(rs.getInt("tipousuario"));
                espArray.add(espModelo);
            }
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga listar o usuario do sistema.
             */
            JOptionPane.showMessageDialog(null, "Erro ao listar usuario\n"+ex.getMessage());
        }
        return espArray;
    }
/**
 * Método utilizado para atualizar os dados do usuario do sistema. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Usuario. 
 */
    @Override
    public void update(Usuario e) {
        try {
            stmt = con.prepareStatement(update);
            stmt.setInt(1, e.getIdusuario());
            stmt.setString(2, e.getNome());
            stmt.setString(3, e.getEmail());
            stmt.setString(4, e.getSenha());
            stmt.setInt(3, e.getTipousuario());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga atualizar o usuaro do sistema. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao atualizar usuario");
        }
    }
/**
 * Método utilizado para deletar os dados o usuario do sistema. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Usuario. 
 */
    @Override
    public void delete(Usuario e) {
        try {
            stmt = con.prepareStatement(delete);
            stmt.setInt(1, e.getIdusuario());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga deletar o usuario doo sistema. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao deletar usuario");
        }
    }
/**
 * Método utilizado para buscar os dados o usuario do sistema. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Usuario. 
 * @return o Array, utilizado para finalizar o método.
 */
    @Override
    public ArrayList<Usuario> search(Usuario e) {
        /**
         * espArray está instânciando um Array.
         */
        espArray = new ArrayList<>();
        try {
            stmt = con.prepareStatement(search);
            stmt.setString(1, e.getNome());
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                espModelo = new Usuario();
                espModelo.setIdusuario(rs.getInt("idusuario"));
                espModelo.setNome(rs.getString("nome"));
                espModelo.setEmail(rs.getString("email"));
                espModelo.setSenha(rs.getString("senha"));
                espModelo.setTipousuario(rs.getInt("tipousuario"));
                espArray.add(espModelo);
            }
        } catch (SQLException ex) {

            /**
             *  Mensagem de erro, caso não consiga listar o usuario do sistema. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao buscar usuario");

        }
        return espArray;
    }
}

